package lvm;

import java.util.Iterator;
import lvm.fonctions.prim.subr.*;
import java.util.Map;
import java.util.Map.Entry;
import org.xml.sax.Attributes;


import javax.management.Attribute;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import lvm.reader.*;
import lvm.struct.Sexpr;
import lvm.struct.Symbole;

public class XmlHandler extends DefaultHandler {

	public XmlHandler() {
		super();
	}
	
	//Evenement détécté lors d'une ouverture de balise
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//super.startElement(uri, localName, qName, attributes);
		System.out.println(qName);
		
		if (qName == "type")
			traiteType(attributes);
		else if (qName == "variable")
			traiteVariable(attributes);
		else if (qName == "primitive")
			traitePrimitive(attributes);
		else if (qName == "load")
			traiteLoad(attributes);
		else if (qName == "loadlibrary")
			traiteLoadLibrary(attributes);
		/*else
			throw new SAXException("Balise "+localName+" inconnue.");
		*/
	}
	
	// Evenemlent détécté lors d'une fin de balise
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//super.endElement(uri, localName, qName);
		//System.out.println("test2" + uri + localName + qName);
	}
	
	// A l'ouverture du document
	@Override
	public void startDocument() throws SAXException {
		System.out.println("Debut de l'analyse du document");
	}

	// A la fin de la lecture du document
	@Override
	public void endDocument() throws SAXException {
		System.out.println("Fin de l'analyse du document");
	}

	/**
	 * Traite un chargement de fichier
	 * 
	 * @param attrs
	 *            les attributs
	 * @throws SAXException
	 */
	protected void traiteLoad(Attributes attrs) throws SAXException {
		
	}

	// Ajoute l'Expr au contexte
	private void traiteType(Attributes attributes) {
		try {
			Class<Sexpr> clas = (Class<Sexpr>) Class.forName(attributes.getValue(2).toString());
			Sexpr se = clas.newInstance();
			Contexte.getContexteCourant().putVariable(attributes.getValue(0).toString(),se);
		
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void traiteVariable(Attributes atts) {
		Contexte.getContexteCourant().putVariable(atts.getValue("name").toLowerCase(),new Symbole(atts.getValue("value").toLowerCase()));
	}

	private void traitePrimitive(Attributes atts) {
		//TODO

	}

	private void traiteLoadLibrary(Attributes atts) {
		//TODO
	}
}
